توابع و کتابخانه ها: توابع سید ناصر رضوی www.snrazavi.ir ۱۳۹۶
1-2 توابع 2
1-2 توابع ۳ x y z f f x, y, z
اجزای برنامه نویسی 4 any program you might want to write objects functions and modules graphics, sound, and image I/O ایجاد برنامه های بزرگ تر و استفاده مجدد از کد arrays conditionals and loops Math primitive data types Text I/O assignment statements
توابع )متدهای استاتیک( 5 تابع جاوا. دریافت صفر ورودی. عنوان به یا چندکمیت به کمیت یک برگرداندن عنوان خروجی. اثرات جانبی نوشتن )مانند نمودار(. ترسیم یا در خروجی کاربردها. مثال. دانشمندان از توابع ریاضی برای محاسبه فرمولها استفاده میکنند. برنامهنویسها از توابع برای ایجاد برنامههای پیمانهای استفاده میکنند. شما از توابع برای هر دو منظور استفاده میکنید. توابع پیش ساخته: Math.random() Math.abs() کتابخانه های و Integer.parseInt() ورودی/خروجی: StdIn.readInt() StdDraw.line() و StdAudio.play() توابع تعریف شده به وسیله کاربر: main()
جاوا تابع یک اجزای ۶ متغیر آرگومان نوع آرگومان نام تابع نوع برگشتی امضا public static double sqrt ( double c ) { if (c < 0) return Double.NaN; double err = 1e-15; double t = c; while ( Math.abs(t - c/t) > err * t) t = (c/t + t) / 2.0; return t; فراخوانی یک متد دیگر دستور بازگشت متغیرهای محلی بدنه متد
کنترل جریان 7 منظور به روش جدید یک توابع کلیدی. نکته کنترل جریان می کنند. فراهم اجرا مراحل فراخوانی یک تابع. کنترل به ابتدای کد تابع فراخوانی شده منتقل میشود. آرگومانها با استفاده از مقادیر موجود در فراخوانی مقداردهی میشوند. کد تابع اجرا میشود. به جای نام تابع در کد فراخوان مقدار برگشتی تابع فراخوانی شده قرار داده کنترل دوباره به کد فراخوان منتقل میشود. می شود. این شیوه توجه. فراخوانی نام دارد. مقدار«با»ارسال
حوزه 8 t err c )برای حوزه مثال. حوزه یک یک نام(. متغیر قسمتی برابر از است کد با که کد می تواند از پس به اعالن آن آن ارجاع نام در متغیر دهد. کد. بلوک درون و حوزه public class Newton { public static double sqrt(double c) { if (c < 0) return Double.NaN; double err = 1e-15; double t = c; while (Math.abs(t - c/t) > err * t) t = (c/t + t) / 2.0; return t; public static void main(string[] args) { int N = args.length; double[] a = new double[n]; for (int i = 0; i < N; i++) a[i] = Double.parseDouble(args[i]); for (int i = 0; i < N; i++) حوزه args[] N و a[] حوزه i { double x = sqrt(a[i]); StdOut.println(x); این کد نمیتواند به a[] و N args[] ارجاع دهد این کد نمیتواند به t و err c ارجاع دهد دو متغیر مختلف iو x حوزه
چالش توابع: 1 فلا- ۹ می افتد اتفاقی زیر چه کد اجرای و کامپایل از پس پرسش. public class Cubes1 { public static int cube(int i) { int j = i * i * i; return j; public static void main(string[] args) { int N = Integer.parseInt(args[0]); for (int i = 1; i <= N; i++) StdOut.println(i + " " + cube(i)); % javac Cubes1.java % java Cubes1 6 1 1 2 8 3 27 4 64 5 125 6 216
چالش توابع: 1 ب- ۱0 می افتد اتفاقی زیر چه کد اجرای و کامپایل از پس پرسش. public class Cubes2 { public static int cube(int i) { int i = i * i * i; return i; public static void main(string[] args) { int N = Integer.parseInt(args[0]); for (int i = 1; i <= N; i++) StdOut.println(i + " " + cube(i));
چالش توابع: 1 پ- ۱۱ می افتد اتفاقی زیر چه کد اجرای و کامپایل از پس پرسش. public class Cubes3 { public static int cube(int i) { i = i * i * i; public static void main(string[] args) { int N = Integer.parseInt(args[0]); for (int i = 1; i <= N; i++) StdOut.println(i + " " + cube(i));
چالش توابع: 1 ت- ۱2 می افتد اتفاقی زیر چه کد اجرای و کامپایل از پس پرسش. public class Cubes4 { public static int cube(int i) { i = i * i * i; return i; public static void main(string[] args) { int N = Integer.parseInt(args[0]); for (int i = 1; i <= N; i++) StdOut.println(i + " " + cube(i));
چالش توابع: 1 ث- ۱۳ می افتد اتفاقی زیر چه کد اجرای و کامپایل از پس پرسش. public class Cubes5 { public static int cube(int i) { return i * i * i; public static void main(string[] args) { int N = Integer.parseInt(args[0]); for (int i = 1; i <= N; i++) StdOut.println(i + " " + cube(i));
توابع از چند مثال ۱4 absolute value of a double value primality test hypotenuse of a right triangle Harmonic number uniform random integer in [0, N) public static double abs(double x) { if (x < 0) return -x; else return x; public static boolean isprime(int N) { if (N < 2) return false; for (int i = 2; i <= N/i; i++) if (N % i == 0) return false; return true; public static double hypotenuse(double a, double b) { return Math.sqrt(a*a + b*b); public static double H(int N) { double sum = 0.0; for (int i = 1; i <= N; i++) sum += 1.0 / i; return sum; public static int uniform(int N) { return (int) (Math.random() * N);
گاوسی توزیع ۱5
گاوسی توزیع ۱۶ گاوسی توزیع استاندارد.»توزیع زنگوله شکل«پایه اغلب تحلیلهای آماری فیزیکی. و اجتماعی علوم در σ = 209 μ = 1019 2000 مثال. نمرات آزمون SAT پیروی میکند. میانگین با گاوسی توزیع یک از سال در معیار انحراف و φ x = 1 2π e x 2 Τ2 φ x, μ, σ = 1 σ 2π e x μ 2 Τ2σ 2
جاوا در پیاده سازی ۱7 توابع ریاضی. را پیادهسازی هر زمان کنید. این صورت غیر در کنید. استفاده ساخته پیش توابع از است ممکن نیاز مورد توابع خودتان public class Gaussian { φ x = 1 public static double phi(double x) { e x 2 Τ2 2π return Math.exp(-x*x / 2) / Math.sqrt(2 * Math.PI); public static double phi(double x, double mu, double sigma) { return phi((x - mu) / sigma) / sigma; φ x, μ, σ = φ x μ σ Τσ بارگذاری اضافه. توابع همنام با امضاهای مختلف با یکدیگر فرق دارند. چندین آرگومان. یک تابع میتواند هر تعداد آرگومان ورودی داشته باشد. فراخوانی توابع دیگر. یک تابع میتواند توابع دیگر را فراخوانی کند.
تجمعی توزیع تابع گاوسی ۱8.Φ z هدف. محاسبه تابع چالش. هیچ عبارت توزیع تجمعی»شکل بسته«گاوسی وجود ندارد و در کتابخانه جاوا نیست. موجود نیز Φ x = න = 1 2 z φ x dx بسط تیلور + φ z z + z3 3 + z5 3 5 + z7 3 5 7 +
پیاده سازی جاوا ۱۹ public class Gaussian { public static double phi(double x) // as before public static double Phi(double z) { if (z < -8.0) return 0.0; if (z > 8.0) return 1.0; double sum = 0.0, term = z; for (int i = 3; sum + term!= sum; i += 2) { sum = sum + term; term = term * z * z / i; return 0.5 + sum * phi(z); public static double Phi(double z, double mu, double sigma) { return Phi((z - mu) / sigma);
آزمون نمرات SAT 20 پرسش. چند درصد از شرکت کنندگان در بودن نمره شرکت کننده باید حداقل برابر با آزمون 820 باشد. شرایط واجد برای نیستند. شرایط واجد SAT پاسخ. Φ 820,1019,209 0.17051 double fraction = Gaussian.Phi(820, 1019, 209);
توابع ایجاد 2۱ توابع به شما امکان میدهند یک سطح جدید از انتزاع ایجاد کنید: فراتر از آن چیزی که کتابخانههای از پیش بستهبندی شده در اختیار شما قرار میدهند. هر زمان بخواهید ابزار مورد نیازتان را ایجاد میکنید: Gaussian.Phi() و... فرآیند. گام ۱: شناسایی مفید ویژگی یک گام 2: پیاده سازی ۳: استفاده گام برنامه ای هر در مجدد استفاده گام که بخواهید. :+۳
کننده جمع مسئله کاالبرگ ها 22 مسئله جمع کننده کاالبرگها. N کارت باید انتخاب شود چند باشیم داشته یکی )حداقل( کارت هر از که این برای مختلف کارت نوع داشتن با فرض می کنیم در هر انتخاب احتمال انتخاب کارت ها با یکدیگر برابر است. N - 1 0 الگوریتم شبیهسازی. یکی داشته باشیم. به صورت و بین عدد صحیح یک بار هر تکراری حداقل کارت هر از که زمانی تا کن انتخاب پرسش. چگونه میتوانیم بررسی کنیم که از هر نوع کارت حداقل یکی داریم پاسخ. با استفاده از یک آرایه بولی به گونهای که found[i] تنها وقتی درست باشیم. داشته یکی حداقل نوع کارت از که است i
کننده جمع مسئله کاالبرگ ها 2۳ public class Coupon { public static void main(string[] args) { int N = Integer.parseInt(args[0]); int cardcnt = 0; // number of cards collected int valcnt = 0; // number of distinct cards // do simulation boolean[] found = new boolean[n]; while (valcnt < N) { int val = (int) (Math.random() * N); cardcnt++; if (!found[val]) { valcnt++; و - 1 )N found[val] = true; نوع کارت بعدی )بین 0 // all N distinct cards found System.out.println(cardcnt);
کننده جمع مسئله کاالبرگ ها: شکل تابعی 24 public class Coupon { public static int uniform(int N) { return (int) (Math.random() * N); public static int collect(int N) { int cardcnt, valcnt = 0; boolean[] found = new boolean[n]; while (valcnt < N) { int val = uniform(n); cardcnt++; if (!found[val]) valcnt++; found[val] = true; return cardcnt; public static void main(string[] args) { int N = Integer.parseInt(args[0]); StdOut.println(collect(N)); found[] cardcnt valcnt val cards collected number collected number that differ current value % java Coupon 1000 6552 % java Coupon 1000 6481 % java Coupon 1000000 12783771
عنوان به آرایه ها آرگومان 25 find the maximum of the arrays value dot product exchange two elements in the array shuffle the array public static double max(double[] a) { double max = Double.NEGATIVE_INFINITY; for (int i = 0; i < a.length; i++) if (a[i] > max) max = a[i]; return max; public static double dot(double[] a double[] b) { double sum = 0.0; for (int i = 0; i < a.length; i++) sum += a[i] * b[i]; return sum; public static void exch(string[] a, int i, int j) { String temp = a[i]; a[i] = a[j]; a[j] = temp; public static void shuffle(string[] a) { int N = a.length; for (int i = 0; i < N; i++) exch(a, i, i + uniform(n - i);
تمرین ها 2۶ تمرین های بخش 2-۱ 4, 5, 8, 12, 15, 19, 21, 27, 28, 29, 32, 34, 39